package com.qf.index;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.json.JSONUtil;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Pattern;

public class ReadWfOld {

    public static void main(String[] args) throws SQLException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(format.format(new Date()) + " 程序开始了~~~");

        int onePageNum = 1000;
//        String limit = "";
        String limit = " limit 1";

        String newDataName = "scholar_25_01.";
        String summaryTable = newDataName + "pm_ut_aid_info_0120";
        String spiderCnCoreTable = newDataName + "spider_cn_core";
        String spiderCnKiAnalysisTable = newDataName + "spider_cnki_analysis";
        String spiderCqVipAnalysisTable = newDataName + "spider_cqvip_analysis";
        String spiderWanFangAnalysisTable = newDataName + "spider_wanfang_analysis";
        String spiderYiiGleAnalysisTable = newDataName + "spider_yiigle_analysis";
        String pmArticleTable = newDataName + "spider_pubmed_vip_extend";
        String utArticleTable = newDataName + "spider_tb_true_92007022_1125";
        String jourMergeTable = newDataName + "basic_jour_merge";
        String quotaTable = newDataName + "basic_core_paper_quota";
        String basicCoreTable = newDataName + "basic_core_paper";
        String wordAndCodeSetMapTable = newDataName + "word_and_code_set_map";
        String fullAbbrKeyWordTable = newDataName + "full_abbr_key_word_1218";
        String pmOrUtIdTablePm = newDataName + "pm_ut_aid_info_pm";

        // 词（药物，数字代号：1; 基因，数字代号：2; 通路，数字代号：3; 疾病，数字代号：4）和code（1，2，3，4）代码集合。
//        Map<String, Set<Integer>> wordAndCodeSetMap = Drug.getWordAndCodeSetMap(wordAndCodeSetMapTable, "id", "word`,`code_set", limit);
//
//        String field = "year`,`journal`,`doi`,`page`,`issue`,`author`,`auemorg`,`fund`,`title`,`abs`,`entitle`,`keyword`,`subject";
//        readWf(spiderWanFangAnalysisTable, onePageNum, limit, "id", field, true, 10, summaryTable, wordAndCodeSetMap);

        String mails = "Wang Tonghua Qu Liang Li Mei Hunan Crop Research Institute, Changsha, 410125 Corresponding author, wangtonghua2004@ 163 .com DOI： 10.3969/mpb.0l0.000245";
        Set<String> doiSet = new HashSet<>();
        String cnMail = getMailDoi(mails, doiSet);
        System.out.println(cnMail);
        System.out.println(doiSet);

        // main
    }


    public static void readWf(String spiderWanFangAnalysisTable, int onePageNum, String limit, String autoId, String field, boolean print, int allTotal, String summaryTable, Map<String, Set<Integer>> wordAndCodeSetMap) throws SQLException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Map<Integer, Integer> dataIdAndAidMap = ReadPm.getDataIdAndAidMap(summaryTable, "id", "cscd_id");
        System.out.println("dataIdAndAidMap.size(): " + dataIdAndAidMap.size());
        List<Entity> tableNum = Db.use().query("select count(1) as count from " + spiderWanFangAnalysisTable);
        List<String> supportedList = rSet.getSupportedList();
        if (tableNum.get(0).getInt("count") < 1) {
            return;
        }
        int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + spiderWanFangAnalysisTable).intValue();
        Collection<Integer> tableList = new ArrayList<>();
        NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
        AtomicInteger sumNum = new AtomicInteger(0);
        int showNum = Math.max((tableList.size() / allTotal), 1) + (tableList.size() % allTotal);
        AtomicInteger startNum = new AtomicInteger(1);
        tableList.parallelStream().forEach(startId -> {
            try {
                List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + spiderWanFangAnalysisTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1) + limit);
                if (print && sumNum.getAndIncrement() % showNum == 0) {
                    System.out.println("\033[31;1m" + format.format(new Date()) + " 读表现在开始：" + startNum.getAndIncrement() + " 总次数：" + allTotal + " 表名：" + spiderWanFangAnalysisTable + Utils.printMemoryStr() + "\033[0m");
                }
                for (Entity entry : tableData) {
                    Integer dataId = entry.getInt(autoId);
                    if (!dataIdAndAidMap.containsKey(dataId)) {
                        continue;
                    }
                    String keyword = Utils.getStrField(entry, "enkeyword").replace("@@", "").trim();
                    String title = Utils.getStrField(entry, "entitle");
                    title = title.startsWith("#_#") ? title.substring("#_#".length()).trim() : title.replace("@@", "").trim();
                    String py = Utils.getStrField(entry, "year");
                    int year = NumberUtil.isInteger(py.trim()) ? Integer.parseInt(py.trim()) : 1900;

                    String abText = Utils.getStrField(entry, "enabs");
                    String cnau = Utils.getStrField(entry, "cnau");
                    String enau = Utils.getStrField(entry, "enau");
                    Set<String> mailSet = new HashSet<>();
                    String di = getMailDoi(abText + " " + cnau + " " + enau, mailSet);

                    String cnjournal = Utils.getStrField(entry, "cnjournal");
                    String journal = cnjournal.isEmpty() ? Utils.getStrField(entry, "enjournal") : cnjournal;
//                    String di = Utils.getStrField(entry, "doi");
                    String page = Utils.getStrField(entry, "page");
                    String volum = Utils.getStrField(entry, "volum");
                    String issue = Utils.getStrField(entry, "issue");
                    // Mol Neurobiol. 2016;53(3):1648-1653. doi: 10.1007/s12035-015-9121-6.
                    String info = journal + ". " + (py + ";") + (volum) + ("(" + (issue.startsWith("0") ? issue.substring(1) : issue) + "): ")
                            + (page + ". ") + (di.length() > 6 ? ("doi: " + (di.endsWith(".") ? di.substring(0, di.length() - 1) : di) + ". ") : "");
                    String cnAuthor = Utils.getStrField(entry, "cnauthor");
                    List<String> authList = new ArrayList<>();
                    if (cnAuthor.length() > 1) {
                        String[] split = cnAuthor.split("; ");
                        authList.addAll(Arrays.asList(split));
                    }
                    String auorg = Utils.getStrField(entry, "auorg");
                    if (auorg.length() > 1) {
                        // 王恕立:武汉理工大学; 滕泽伟:湖北经济学院经济与贸易学院,湖北武汉,430205; 王许亮:武汉理工大学
                        String[] split = auorg.split("; ");
                        for (String auths : split) {
                            String[] authUnits = auths.split(":");
                            for (int i = 0; i < authUnits.length; i++) {
                                String s = authUnits[i].replaceAll(" +", " ").replace("（", "(").replace("）", ")").replace("【", "[").replace("】", "]")
                                        .replace("( ", "(").replace(" )", ")").replace("[ ", "[").replace(" ]", "]").replace("()", "").replace("[]", "").trim();
                                if (i == 0 && (s.length() < 6 || s.contains("·") || (s.contains("(") && s.contains(")")) || (s.contains("[") && s.contains("]")) || (!Utils.isContainChinese(s) && s.length() < 26 && s.length() > 3))) {
//                                            auth = s;
                                    if (!authList.contains(s)) {
                                        authList.add(s);
                                    }
                                }
                            }
                        }
                    }

                    List<En.C1Auth> c1List = Utils.getWpC1List(Utils.getStrField(entry, "origin"));
//                    String fus = Utils.getStrField(entry, "fund");
                    List<String> fundList = ReadCd.getCsCdFundList(Utils.getStrField(entry, "fund"), supportedList);
                    List<En.CategoryAndInfo> categoryAndInfoList = Drug.getDrug(title, keyword, abText, wordAndCodeSetMap);
                    String cnKey = Utils.getStrField(entry, "cnkeyword");
                    String cnTi = Utils.getStrField(entry, "cntitle").replaceAll("<[a-z]+ [^>]*>", " ").replaceAll("</[a-z]+>", " ").replaceAll(" +", " ").trim();
                    String cnAb = Utils.getStrField(entry, "cnabs").replaceAll("<[a-z]+ [^>]*>", " ").replaceAll("</[a-z]+>", " ").replaceAll(" +", " ").trim();

                    try {
                        Db.use().update(
                                Entity.create().set("doi", di)
                                        .set("title", Utils.getStrField(entry, "entitle"))
                                        .set("ab", Utils.getStrField(entry, "enabs"))
                                        .set("keyword", Utils.getStrField(entry, "enkeyword"))
                                        .set("journal", journal)
                                        .set("year", year)
                                        .set("c1_au", JSONUtil.toJsonStr(c1List))
                                        .set("auth", JSONUtil.toJsonStr(authList))
                                        .set("fund_list", JSONUtil.toJsonStr(fundList))
                                        .set("info", info)
                                        .set("cn_ti", cnTi)
                                        .set("cn_ab", cnAb.startsWith("<正>") ? cnAb.substring("<正>".length()) : cnAb)
                                        .set("cn_kw", ReadUt.strToJson(entry.getStr("keyword")))
                                        .set("subject", ReadUt.strToJson(entry.getStr("subject")))
                                        .set("mail_list", JSONUtil.toJsonStr(mailSet))
                                ,
                                Entity.create(summaryTable).set("id", dataIdAndAidMap.get(dataId)));
                    } catch (SQLException ee) {
                        ee.printStackTrace();
                    }

                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        });
//        }
    }

    // 万方，维普等中文数据库中的邮箱提取比较麻烦，单独写了一个。
    public static String getMailDoi(String s, Set<String> mailSet) {
        String di = "";
        if (null != s && (s.contains("＠") || s.contains("@")) && !s.contains("投稿") && !s.contains("征稿") && !s.contains("编辑部") && !s.contains("欢迎作者") && !s.contains("会议") && !s.contains("邮编") && !s.contains("联系人")) {
            // .replaceAll("@([a-zA-Z0-9]+) ([a-zA-Z0-9]+)\\.", "@$1$2.") 处理类似这样的：zyfzf@1 63.net   Pattern.compile("@[a-zA-Z0-9]").matcher(mail).find()，这个功能是排除@后面有中文或其它符号的。
            String[] split = s.toLowerCase().replace("＠", "@").replace("﹕", ":").replace("：", ":").replace("︰", ":").replace("﹒", ".")
                    .replace("．", ".").replace("｡", ".").replace("‧", ".").replace("⋅", ".").replace("。", ".").replace("·", ".").replace("•", ".")
                    .replace("∙", ".").replace("·", "⬢").replace("ㆍ", ".").replace("▪", ".").replace("・", ".").replace("；", " ").replace("，", " ")
                    .replace("？", " ").replace("）", " ").replace("】", " ").replace("！", " ").replace("（", " ").replace("【", " ").replace(";", " ")
                    .replace(",", " ").replace("?", " ").replace(")", " ").replace("]", " ").replace("!", " ").replace("(", " ").replace("[", " ")
                    .replaceAll(" +", " ").replace(" @", "@").replace("@ ", "@").replace(" .", ".").replace(". ", ".").replaceAll(" +", " ")
                    .replace("doi: ", "doi:").replace("doi :", "doi:").replaceAll("@([a-zA-Z0-9]+) ([a-zA-Z0-9]+)\\.", "@$1$2.").split(" ");
            for (String t : split) {
                if (Pattern.compile("@[a-zA-Z0-9]").matcher(t).find() && Utils.fuHeiMail(t)) {
                    mailSet.add(Utils.dellEnd(t));
                }
                if (t.contains("doi:10.")) {
                    String doi = t.substring(t.indexOf("doi:10.") + "doi:".length());
                    if (doi.length() > 11) {
                        di = doi;
                    }
                }
            }
        }
        return di;
    }


    /*
      原创论文|613205
      unknown|315044
      综述|86299
      病例报告|72057
      消息|46605
      述评|32282
      其他|31661
      继续教育|16047
      文摘|15155
      指南|6806
      会议报道|4760
      Meta分析|1024
      读者来信|903
     */

    /*
      CREATE TABLE `pm_ut_aid_info_wf` (
        `id` int(10) NOT NULL AUTO_INCREMENT,
        `key_word_list` longtext COMMENT '关键词集合，此是基于标题、摘要、关键词三处的整合',
        `pm_ut_doi_list` text COMMENT 'pm、doi、ut三者的集合，用于童工的ES检索',
        `journal` text COMMENT '期刊的名称',
        `aid` int(9) DEFAULT NULL COMMENT '因与原表字段重名，pid改为aid，论文的唯一主键，使用老鲍的论文基础表中的自增主键',
        `citation_quota` double DEFAULT NULL COMMENT '引文的质量（按中科院分区表）',
        `reference_quota` double DEFAULT NULL COMMENT '参文的质量',
        `ti_key` text COMMENT '从标题中提取的关键词',
        `ab_key` longtext COMMENT '从摘要中提取的关键词',
        `kw_key` longtext COMMENT '从关键词中提取的关键词(若是主题词给予转换)',
        `abb_word` longtext COMMENT '从简写中提取出来的关键词（是一对）',
        `zky_dalei` int(1) DEFAULT NULL COMMENT '中科院的期刊分区表最佳的大类',
        `jcr_if` double DEFAULT NULL COMMENT 'jcr(scie)期刊影响因子',
        `year` int(4) DEFAULT NULL COMMENT '论文的出版年',
        `title` text COMMENT '论文的原始标题',
        `keyword` longtext COMMENT '论文的原始关键词',
        `ab` longtext COMMENT '论文的原始摘要',
        `mesh` text COMMENT 'PubMed的主题词表，含主题词和副主题词',
        `jid` int(9) DEFAULT NULL COMMENT '期刊的唯一id号，此为期刊关联表的自增主键',
        `discussion` longtext COMMENT '摘要提取出来的特定字段',
        `results` longtext COMMENT '摘要提取出来的特定字段',
        `methods` longtext COMMENT '摘要提取出来的特定字段',
        `background` longtext COMMENT '摘要提取出来的特定字段',
        `c1_list` longtext COMMENT 'wos表中的c1或PubMed表中的作者单位信息字段，只保留单位信息',
        `c1_unit_list` longtext COMMENT '从c1中提取出来的单位信息',
        `rp_list` longtext COMMENT 'wos表中的rp字段，只保留单位信息',
        `rp_unit_list` longtext COMMENT '从rp中提取出来的单位信息',
        `cite` longtext COMMENT '参文格式（NLM、APA、MLA、AMA四种）',
        `cn_ti` text COMMENT '中文的文献标题',
        `cn_ab` longtext COMMENT '中文的文献摘要',
        `cn_kw` longtext COMMENT '中文的文献关键词',
        `cn_type` text COMMENT '中文的文献的类型，综述等',
        `pt` text COMMENT '英文的文献的类型，综述等，是一个集合',
        `cn_country` text COMMENT '中文的发文的国家，区分第一或通讯以及其它的，此为非第一或通讯',
        `cn_unit` longtext COMMENT '中文的发文的机构，区分第一或通讯以及其它的，此为非第一或通讯',
        `is_cns` int(1) DEFAULT NULL COMMENT '六大顶级刊，是为1，否为0',
        `cn_fund` longtext COMMENT '中文的基金的名称',
        `cn_country_1` text COMMENT '中文的发文的国家，区分第一或通讯以及其它的，此为第一或通讯',
        `cn_unit_1` text COMMENT '中文的发文的机构，区分第一或通讯以及其它的，此为第一或通讯',
        `pmId` int(8) DEFAULT NULL COMMENT '最大8位的pmId号',
        `ut` varchar(15) DEFAULT NULL COMMENT '此为15位的UT号',
        `doi` text COMMENT 'doi号集合',
        `nlmId` varchar(25) DEFAULT NULL COMMENT 'nlmId号，无其它字符',
        `cite_score` double DEFAULT NULL COMMENT '期刊citeScore影响因子值',
        `jcr_quartile` int(1) DEFAULT NULL COMMENT 'jcr(scie)期刊分区',
        `fund` longtext COMMENT '来自wos的基金名称(FU字段)',
        `fund_list` longtext COMMENT '从原始基金信息中提供出来的基金名称，待规范。',
        `method_info` longtext COMMENT '摘要提取出来的特定字段集合',
        `trans_ok` int(1) DEFAULT NULL COMMENT '翻译完成为1，没有完成为0',
        `drug_gene_pathway_disease` longtext COMMENT '药物、基因、通路、疾病',
        `auth` longtext COMMENT '原始的作者信息，全写',
        `sort_auth` longtext COMMENT 'Chang-Ming Huang  英文名字中，新志贾这类属于正序，反之贾新志这类属于反序，程序默认为正序转反序，如果是反序则不用再转换了。',
        `info` longtext COMMENT '备用字段',
        `is_retraction` int(1) DEFAULT NULL COMMENT '是否是撤稿，是为1，否为0；',
        `is_china` int(1) DEFAULT NULL COMMENT '是否是中国人发表的，是为1，否为0；',
        `cn_discussion` longtext COMMENT '中文摘要提取出来的特定字段',
        `cn_results` longtext COMMENT '中文摘要提取出来的特定字段',
        `cn_methods` longtext COMMENT '中文摘要提取出来的特定字段',
        `cn_background` longtext COMMENT '中文摘要提取出来的特定字段',
        PRIMARY KEY (`id`),
        KEY `aid` (`aid`),
        KEY `pmId` (`pmId`),
        KEY `ut` (`ut`),
        KEY `jid` (`jid`),
        KEY `trans_ok` (`trans_ok`)
      ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
     */


}
